/***********************************************************************************
 * 文件名： mcu_adc.h
 * 版本：1
 * 说明：
 * 		MDT10F272 的ADC外设驱动。使用说明见头文件。在 bsp-mdt10f272_config.h 文件中可配置初始状态
 * 修改记录：
 * 	2021/07/14: 初版
***********************************************************************************/
#include "mcu_ad.h"
#include "polsys_lib.h"

bit _Adc_mADContinueRun;
u8 _Adc_mNowCH;
volatile bit _Adc_mRunning = false;
volatile u8 _Adc_RunTime = 0;

#if ADC_DISCARD_NUM
u8 _Adc_mDiscard;
#endif

static bit Adc_mCRBuff;
static bit Adc_mIEBuff;

// ADC初始化，初始化后ADC将会使能
// 按照配置文件中的初始参数进行初始化。注意中断初始状态在 Mcu_Init 中已统一初始化
void Adc_Init()
{                    
    ADFM = 0;        
    ADC_CLK_SEL();   
    ADSTASEL_BUZY(); 
    ADC_EN = 1;      
}




#if ADC_DISCARD_NUM
// 设置AD转换参考电压，注意ADC正在转换时不要调用。
// u8_vref:参考电压，取值范见配置文件bsp-272cfg.h
void Adc_SetADCVref(u8 vref) 
{
	if(Adc_GetVref()!=vref)
	{                           
		ADS0 &= 0xF0;           
		ADS0 = ADS0 | vref;  
		_Adc_mDiscard = 0;       
	}
}
#else
// 设置AD转换参考电压，注意ADC正在转换时不要调用。
// u8_vref:参考电压，取值范见配置文件bsp-272cfg.h
void Adc_SetADCVref(u8 vref) \
{                           \
	ADS0 &= 0xF0;           \
	ADS0 = ADS0 | vref;  \
}
#endif

// 启动一次AD转换，并返回结果
// 将会等待ADC空闲，注意，如果在调用前启动了ADC单次异步转换任务，并在完成回调中始终启动转换，ADC将会一直繁忙，本函数会死等阻塞。
// 将会临时打断连续转换任务，转换时临时关闭了ADC中断
u8 Adc_GetValue(u8 vf, u8 ch)
{
	u8 i;
	u16 Sum=0;
	u8 Volt = 0;

	Adc_mCRBuff = _Adc_mADContinueRun;
	_Adc_mADContinueRun = false;	// 暂时关闭连续转换

	while(_Adc_mRunning);		// 等待ADC空闲，注意，如果在ADC完成中断线程中不停的启动转换，将会死等。

	Adc_mIEBuff = ADIE;
	ADIE = 0;
	ADS0 = 0;
	ADS0 = ADS0 | ch | vf; // 模拟通道选择
	
    for (i = 0; i < ADC_DISCARD_NUM + 4; i++)
    {
		BUSY = 1;			//开始转换
		while(BUSY);		//等待AD 转换完成  
        // 记录 滤波
        if (i >= ADC_DISCARD_NUM)
        {
            Sum += ADRESH;
        }
    }

	Volt = (Sum >> 2) & 0xFF;

	ADIF = 0;
	ADIE = Adc_mIEBuff;
	_Adc_mADContinueRun = Adc_mCRBuff;

	return Volt; //返回AD结果值
}


#if ADC_DISCARD_NUM
// 【异步】启动一次AD转换
// u8_ch : 通道号，取值范见配置文件bsp-272cfg.h
// 转换完成后触发 Adc_EventDone
void Adc_Start(u8 ch)         
{                                 
	if (Adc_GetCH() != ch)     
	{                             
		ADS0 &= 0x0F;             
		ADS0 |= ch;      
		_Adc_mDiscard = 0;         
	}
	_Adc_mRunning = true;       
	_Adc_RunTime = 0;    
	BUSY = 1;        
}
#else
// 【异步】启动一次AD转换
// u8_ch : 通道号，取值范见配置文件bsp-272cfg.h
// 转换完成后ADIF=1,如果开启ADC中断将会产生中断，可在中断服务函数中获取结果
void Adc_Start(u8 ch)      
{                           
	ADS0 &= 0x0F;
	ADS0 = ADS0 | ch;    
	BUSY = 1;       
	_Adc_mRunning = true;               
}
#endif




